﻿#pragma once

#include <QStringList>
#include <QVariant>
#include "UtilsExport.h"
#include "Global.h"

class QSettings;

namespace Domy {

/**
 * @brief The Configuration class
 * @note  配置管理器
 */
class UTILS_EXPORT Configuration
{
    Configuration();
    ~Configuration();
public:
#define domy_config Domy::Configuration::getInstance()
    static Configuration *getInstance();

    /**
     * @brief saveWindowState
     * @note  保存窗口状态
     * @param data 窗口状态
     */
    bool saveWindowState(const QByteArray &data);

    /**
     * @brief saveWindowState
     * @note  保存窗口状态
     * @param data      窗口状态
     * @param file_name 文件名
     */
    bool saveWindowState(const QByteArray &data, const QString &file_name);

    /**
     * @brief loadWindowState
     * @note  加载窗口状态
     */
    QByteArray loadWindowState() const;

    /**
     * @brief loadWindowState
     * @note  加载窗口状态
     */
    QByteArray loadWindowState(const QString &file_name) const;

    /**
     * @brief saveWindowGeometry
     * @note  保存窗口位置
     * @param data 窗口位置
     */
    bool saveWindowGeometry(const QByteArray &data);

    /**
     * @brief saveWindowGeometry
     * @note  保存窗口位置
     * @param data      窗口位置
     * @param file_name 文件名
     */
    bool saveWindowGeometry(const QByteArray &data, const QString &file_name);

    /**
     * @brief loadWindowGeometry
     * @note  加载窗口位置
     */
    QByteArray loadWindowGeometry() const;

    /**
     * @brief loadWindowGeometry
     * @note  加载窗口位置
     * @param file_name 文件名
     */
    QByteArray loadWindowGeometry(const QString file_name) const;

    /**
     * @brief getSettingsValue
     * @note  获取配置项
     * @param group 配置组
     * @param key   配置键
     */
    QVariant getSettingsValue(const QString &group, const QString &key) const;

    /**
     * @brief setSettingsValue
     * @note  设置配置项
     * @param group 配置组
     * @param key   配置键
     * @param value 配置值
     */
    void setSettingsValue(const QString &group, const QString &key, const QVariant &value);

    /**
     * @brief getAllSchemeNames
     * @note  获取所有配色方案名称
     */
    QStringList getAllSchemeNames() const;

    /**
     * @brief getColorSchemeValue
     * @note  获取配色方案值
     * @param name 配色方案名称
     * @param key  配置键
     */
    QVariant getColorSchemeValue(const QString &name, const QString &key) const;

    /**
     * @brief setColorSchemeValue
     * @note  设置配色方案值
     * @param name 配色方案名称
     * @param key  配置键
     */
    void setColorSchemeValue(const QString &name, const QString &key, const QVariant &value) const;

    /**
     * @brief copyColorScheme
     * @note  复制配色方案
     * @param name     配色方案名称
     * @param new_name 新的配色方案名称
     */
    bool copyColorScheme(const QString &name, const QString &new_name);

    /**
     * @brief deleteColorScheme
     * @note  删除配色方案
     * @param name 配色方案名称
     */
    bool deleteColorScheme(const QString &name);

    /**
     * @brief saveRecetFilesList 保存最近打开文件列表
     * @param recent 最近打开文件列表
     */
    bool saveRecetFilesList();

    /**
     * @brief getRecentFilesList
     * @note  获取最近打开文件列表
     */
    QStringList getRecentFilesList() const;

    /**
     * @brief getRecentFilesListRef
     * @note  获取最近打开文件列表引用
     */
    QStringList &getRecentFilesListRef();

    /**
     * @brief checkRecentFilesCounts
     * @note  检查最近打开文件列表数量
     */
    void checkRecentFilesCounts();

    /**
     * @brief getLastOpenDirPath
     * @note  获取最近一次打开的目录路径
     */
    QString getLastOpenDirPath() const;

private:
    bool saveByteArrayFile(const QByteArray &data, const QString &file_name);
    QByteArray loadByteArrayFile(const QString &file_name) const;

    void initSettings();

    void initScheme();

    QStringList loadRecentFilesList() const;

private:
    QSettings       *m_settings;

    QMap<QString,
    QSettings *>     m_scheme;

    mutable QString  m_last_open_dir;

    QStringList      m_recent_files;
};

} // namespace Domy
